–Keras模型融合

Keras模型融合

0x01 概述

sklearn有voting(软/硬),stacking,bagging(pasting),boosting等

那么Keras呢?

  • Merge的使用
  • Concatenate
  • Xception等模型融合
  • 其他

0x01 Merge

{“sum”,“mul”,“concat”,“ave”,“cos”,“dot”}

  • 用法
  • 示例
  • 注意点: 我自己在试试的时候,发现两个模型的Node_Name不能有重复,一定药水iUnique的

0x02 Concatenate

keras2.0 Merge层改为函数式
不能再向以前一样使用

model.add(Merge([Model1,Model2]))

变成了麻烦点的(最好不用)

merge([tensor1, tensor2], mode=’concat’, concat_axis= )

推荐使用函数式
out = Concatenate()([model1.output, model2.output],axis=1)*#拼接输出,融合成功

或者

t=keras.layers.Concatenate(axis=1)([top1_model,top2_model])

concatenate从名字可以看出是连接两个数组
小小演示

三模型融合例子

0x03 Xception等融合

使用concatenate

Plant_disease_Recognation时用到过

  • 参考例子
  • 其实和“其他”的那个融合差不多勒···

思想:

  • import 预训练模型输出的特征图
  • 使用concatenate连接各模型的输出
  • 使用Dense-Dropout-Dense学习连接后的特征图
  • 输出为原输出形状

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def bulid_model():
cnn_no_vary = False

input_layer=Input(shape=(299,299,3))

xception = build_model_Xception()
vgg19 = build_model_VGG19()
inceptionresnetv2 = build_model_InceptionResNetV2()


# for i,layer in enumerate(inceptionresnetv2.layers):
# inceptionresnetv2.layer[i].trainable = False

# for i,layer in enumerate(xception.layers):
# xception.layers[i].trainable=False
# for i,layer in enumerate(vgg19.layers):
# vgg19.layers[i].trainable=False


best_vgg19_weights, vgg19_epoch = get_best_model('/home/yjz/lhj/others_model/vgg/models')
best_xception_weights, xception_epoch = get_best_model('/home/yjz/lhj/others_model/Crop-Disease-Detection/models')
best_inceptionresnetv2_weights, inceptionresnetv2_epoch = get_best_model('/home/yjz/lhj/others_model/Inception/models')

vgg19.load_weights(best_vgg19_weights)
xception.load_weights(best_xception_weights)
inceptionresnetv2.load_weights(best_inceptionresnetv2_weights)

inceptionresnetv2 = inceptionresnetv2(input_layer)
xception = xception(input_layer)
vgg19 = vgg19(input_layer)

t=layers.Add()([inceptionresnetv2,xception,vgg19])
#x = Dense(num_classes, name='Logits')(t)
#x = Dropout(dropout_rate, name='Dropout')(x)
top_model = Dense(num_classes, activation='softmax')(t)
model=Model(inputs=input_layer,outputs=top_model)
print(model.summary())
return model

0x0 其他